﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;

namespace Lcsoft.Data.MongoDB
{
	/// <summary>
	/// 为具有自增标识符的实体对象的数据访问层提供基类。
	/// </summary>
	public abstract class AutoIncrementIdObjectDALBase<T, TId> : MongoDBDALBase<T, TId>
	{
		/// <summary>
		/// 初始化 <see cref="MongoDBDALBase{T, TId}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">连接字符串。</param>
		protected AutoIncrementIdObjectDALBase(string masterGroup) : base(masterGroup) { }

		/// <summary>
		/// 初始化 <see cref="MongoDBDALBase{T, TId}"/> 对象。
		/// </summary>
		/// <param name="masterGroup">主机连接字符串的分组名称。</param>
		/// <param name="slaveGroup">从机连接字符串的分组名称。</param>
		protected AutoIncrementIdObjectDALBase(string masterGroup, string slaveGroup) : base(masterGroup, slaveGroup) { }

		/// <summary>
		/// 获取或设置记录数据库自增标识的集合名称。
		/// </summary>
		protected virtual string AutoIncrementCollectionName
		{
			get { return "DbAutoIncrements"; }
		}

		/// <summary>
		/// 清除标识符记录。
		/// </summary>
		/// <param name="writeConcern">指定 <see cref="WriteConcern"/> 对象。</param>
		/// <remarks>注意：请使用 <see cref="MongoDBDALBase{T,TId}.GetDatabase"/> 连接服务器。</remarks>
		public virtual WriteConcernResult UnsetId(WriteConcern writeConcern = null)
		{
			var collection = this.GetCollection(this.AutoIncrementCollectionName);

			return collection.Update(Query.EQ(this.IdName, this.CollectionName), Update.Unset("Index"), writeConcern);
		}

		/// <summary>
		/// 重置标识符记录。
		/// </summary>
		/// <param name="defaultValue">为标识符指定一个默认值。</param>
		/// <param name="writeConcern">指定 <see cref="WriteConcern"/> 对象。</param>
		/// <remarks>注意：请使用 <see cref="MongoDBDALBase{T,TId}.GetDatabase"/> 连接服务器。</remarks>
		public virtual WriteConcernResult ResetId(TId defaultValue, WriteConcern writeConcern = null)
		{
			var collection = this.GetCollection(this.AutoIncrementCollectionName);

			return collection.Update(Query.EQ(this.IdName, this.CollectionName), Update.Set("Index", BsonValue.Create(defaultValue)), writeConcern);
		}
	}
}
